import sys
import pygame

from random import randint
from settings import Settings
from meteor import Meteor

class MeteorShower:
    '''管理背景资源和行为的类'''

    def __init__(self):
        '''初始化背景并创建背景资源'''
        pygame.init()#初始化背景，让Pygame能够正常工作
        self.settings=Settings(self)

        self.screen=pygame.display.set_mode(
            (self.settings.screen_width,self.settings.screen_height)
        )
        pygame.display.set_caption("一起来看流星雨")#设置标题

        #创建一个流星并计算一行可以容纳多少个流星
        #流星间距为流星宽度
        meteor=Meteor(self)
        meteor_width,meteor_height=meteor.rect.size
        available_space_x=self.settings.screen_width-(2*meteor_width)
        self.numbers_meteors_x=available_space_x//(2*meteor_width)

        #计算可以容纳多少行流星
        #行间距为流星高度
        available_space_y=self.settings.screen_height-(2*meteor_height)
        self.number_rows=available_space_y//(2*meteor_height)

        self.meteors=pygame.sprite.Group()#设立流星编组
        self._create_meteors()

    def _run(self):
        '''开始展示背景的主循环'''
        while True:
            self._check_events()
            self._update_meteors()
            self._update_screen()

    def _check_events(self):
        '''响应按键和鼠标事件'''
        for event in pygame.event.get():
            if event.type==pygame.QUIT:#若鼠标点到屏幕上方的x，背景展示结束
                sys.exit()

    def _create_meteor(self,meteor_number,row_number):
        '''创立一个流星，并将其放入当前行'''
        meteor=Meteor(self)
        meteor_width,meteor_height=meteor.rect.size
        meteor.rect.x=meteor_width+2*meteor_width*meteor_number
        meteor.rect.y=meteor_height+2*meteor_height*row_number
        self.meteors.add(meteor)
    
    def _create_meteors(self):
        '''创立流星群'''
        for row_number in range(self.number_rows):
            for meteor_number in range(self.numbers_meteors_x):
                row_number=randint(0,self.number_rows)
                meteor_number=randint(0,self.numbers_meteors_x)
                self._create_meteor(meteor_number,row_number)

    def _update_meteors(self):
        '''
        更新调整流星位置,
        并删除溢出的流星，
        重新构造流星群
        '''
        #更新调整流星的位置
        self.meteors.update()

        #删除溢出的流星
        for meteor in self.meteors.copy():
            if meteor.rect.y >=self.settings.screen_height:
                self.meteors.remove(meteor)

        #重新构造流星群
        if len(self.meteors)<=(self.number_rows*self.numbers_meteors_x):
            for metero_number in range(self.numbers_meteors_x):
                metero_number=randint(0,self.numbers_meteors_x)
                self._create_meteor(metero_number,1)

    def _update_screen(self):
        '''更新屏幕上的图像,并切换到新屏幕'''
        self.screen.fill(self.settings.bg_color)
        self.meteors.draw(self.screen)#画流星

        pygame.display.flip()#刷新屏幕

if __name__=='__main__':
    #创建背景实例并运行背景
    watcher=MeteorShower()
    watcher._run()


                
    